package Dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;

import Conexao.ConnectionManager;
import Modelo.Cliente;
import Modelo.Emprestimo;
import Modelo.Livro;
import Modelo.Multa;

public class EmprestimoDaoImp implements EmprestimoDAO{
	
	private final String INSERT = "insert into emprestimo (dataEmp, dataDev, idlivro, idCliente) values (?,?,?,?)";
	private final String UPDATE = "update emprestimo set devolucao = ?, emprestimo = ? where idemprestimo = ?";
	private final String DELETE = "delete from emprestimo where idEmprestimo = ?";
	private final String ALL = "select * from emprestimo";
	private final String ID = "select * from emprestimo where idEmprestimo = ?";
	private final String CPF = "select * from emprestimo where cpf = ?";
	
	private final String MULTA = " select C.Nome, L.Titulo, E.dataEmp, E.dataDev,"
									   + " case when E.dataDev > E.dataEmp then 'Em Atraso' when E.dataDev <= E.dataEmp then 'Em aberto'"
									   + " end as status,"
									   + "case  when E.dataDev > E.dataEmp then (E.dataDev - E.dataEmp) * ml.valor"
									   + "end as valormulta"
									   + "FROM  Emprestimo E inner join Cliente C ON C.idCliente = E.idCliente inner join"
									   + "Livro L ON L.idLivro = E.idLivro inner joinmulta ml ON ml.idmulta = l.idmulta;";
									  
       
    
	
	private static Connection connection;
	
	public EmprestimoDaoImp() {
		openConnection();
	}
	
	public Emprestimo salvar(Emprestimo e){
		try {
			PreparedStatement ps = null;
			
			ps = ConnectionManager.getInstance().getConnection().prepareStatement(INSERT);
			
			ps.setObject(1, e.getEmprestimo());
			ps.setObject(2, e.getDevolucao());
			ps.setObject(3, e.getLivro().getIdLivro());
			ps.setObject(4, e.getCliente().getIdCliente());
			
			ps.executeUpdate();
			
		} catch (SQLException ex) {
			Logger.getLogger(EmprestimoDaoImp.class.getName()).log(Level.SEVERE, null, ex);
		} finally {
			this.closeConnection();
		}
		return e;
	}
	
	public void alterar(Emprestimo e) {
		PreparedStatement ps = null;
		try {
			ps = connection.prepareStatement(UPDATE);
						
			ps.setObject(1, e.getEmprestimo());
			ps.setObject(2, e.getDevolucao());
			ps.setObject(3, e.getLivro());
			
			
			ps.executeUpdate();

		} catch (SQLException ex) {
			Logger.getLogger(EmprestimoDaoImp.class.getName()).log(Level.SEVERE, null, ex);
		} finally {
			this.closeConnection();
		}
	}
	
	public void deletar(Emprestimo e) {
		try {
			PreparedStatement ps = null;
			ps = connection.prepareStatement(DELETE);

			ps.setObject(1, e.getIdEmprestimo());
			
			ps.executeUpdate();

		} catch (SQLException ex) {
			Logger.getLogger(EmprestimoDaoImp.class.getName()).log(Level.SEVERE, null, ex);
		} finally {
			this.closeConnection();
		}
	}

	public List<Emprestimo> findAll() {
		List<Emprestimo> emprestimos = new ArrayList<Emprestimo>();

		try {
			PreparedStatement ps = null;
			ResultSet rs = null;
			
			ps = connection.prepareStatement(ALL);
			
			rs = ps.executeQuery();
			
			while (rs.next()) {
				Emprestimo emprestimo = new Emprestimo();
				emprestimo.setIdEmprestimo(rs.getInt("idEmprestimo"));
				emprestimo.setEmprestimo(rs.getDate("emprestimo"));
				emprestimo.setDevolucao(rs.getDate("devolucao"));
				Livro livro = DAOFactory.getLivroDAO().buscarLivroPorId(rs.getInt("idLivro"));
				Cliente cliente = DAOFactory.getClienteDAO().buscarClientePorId(rs.getInt("idCliente"));
				emprestimo.setCliente(cliente);
				emprestimo.setLivro(livro);
				emprestimos.add(emprestimo);
			}

		} catch (SQLException ex) {
			Logger.getLogger(EmprestimoDaoImp.class.getName()).log(Level.SEVERE, null, ex);
		} finally {
			this.closeConnection();
		}
		return emprestimos;
	}
	
	public Emprestimo buscarEmprestimoPorId(int idEmprestimo) {
		List<Emprestimo> emprestimos = new ArrayList<Emprestimo>();

		try {
			PreparedStatement ps = null;
			ResultSet rs = null;
			
			ps = connection.prepareStatement(ID);
			ps.setObject(1, idEmprestimo);
			
			rs = ps.executeQuery();
			
			while (rs.next()) {
				Emprestimo emprestimo = new Emprestimo();
				emprestimo.setIdEmprestimo(rs.getInt("idEmprestimo"));
				emprestimo.setEmprestimo(rs.getDate("emprestimo"));
				emprestimo.setDevolucao(rs.getDate("devolucao"));
				Livro livro = DAOFactory.getLivroDAO().buscarLivroPorId(rs.getInt("idLivro"));
				emprestimo.setLivro(livro);
				emprestimos.add(emprestimo);
			}

		} catch (SQLException ex) {
			Logger.getLogger(EmprestimoDaoImp.class.getName()).log(Level.SEVERE, null, ex);
		} finally {
			this.closeConnection();
		}
		if (emprestimos.isEmpty()) {
			return null;
		} else {
			return emprestimos.get(0);
		}
	}
	

	
	public boolean isConnectionClose() {
		try {
			return connection.isClosed();
		} catch (SQLException ex) {
			return false;
		}
	}

	@Override
	public void openConnection() {
		if ( connection == null) {
			connection = ConnectionManager.getInstance().getConnection();
		}
		
		if ( isConnectionClose() ) {
			connection = ConnectionManager.getInstance().getConnection();
		}		
	}

	@Override
	public void closeConnection() {
		if ( connection != null && !this.isConnectionClose()) {
			ConnectionManager.getInstance().closeConnection(connection);
		}
		
	}

	@Override
	public List<Emprestimo> listarHistorico(Cliente cliente) {
		List<Emprestimo> emprestimos = new ArrayList<Emprestimo>();

		try {
			PreparedStatement ps = null;
			ResultSet rs = null;
			
			ps = connection.prepareStatement(CPF);
			ps.setObject(1, cliente.getCpf());
			
			rs = ps.executeQuery();
			
			while (rs.next()) {
				Emprestimo emprestimo = new Emprestimo();
				emprestimo.setIdEmprestimo(rs.getInt("idEmprestimo"));
				emprestimo.setEmprestimo(rs.getDate("emprestimo"));
				emprestimo.setDevolucao(rs.getDate("devolucao"));
				Livro livro = DAOFactory.getLivroDAO().buscarLivroPorId(rs.getInt("idLivro"));
				emprestimo.setLivro(livro);
				emprestimos.add(emprestimo);
			}

		} catch (SQLException ex) {
			Logger.getLogger(EmprestimoDaoImp.class.getName()).log(Level.SEVERE, null, ex);
		} finally {
			this.closeConnection();
		}
		return emprestimos;
	}
	
	public List<Multa> ListarMultas(Multa multa){
		List<Multa> multas = new ArrayList <Multa>();
		
		try {
			PreparedStatement ps = null;
			ResultSet rs = null;
			
			ps = connection.prepareStatement(MULTA);
						
			rs = ps.executeQuery();
		
		while (rs.next()){
			Multa multa1 = new Multa();
			multa1.setNome(rs.getString("nome"));
			multa1.setTitulo(rs.getString("titulo"));
			multa1.setDataEmp(rs.getDate("dataEmp"));
			multa1.setDataDev(rs.getDate("dataDev"));
			multa1.setStatus(rs.getString("status"));
			multa1.setValorMulta(rs.getDouble("valorMulta"));
			multas.add(multa1);
		} 
		} catch (SQLException ex) {
			Logger.getLogger(EmprestimoDaoImp.class.getName()).log(Level.SEVERE, null, ex);
		} finally {
			this.closeConnection();
		}
		
		return multas;
	}
	
	
}
